﻿using System;
using System.Web;
using System.Web.UI.WebControls;
using System.Collections.Generic;
using System.Text;
using BLL;
using DTO;

public partial class pesquisar : Pagina
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!IsPostBack)
            {
                PreencherListEquipamentos();
                // query tipo e tipo detalhado
                if (!string.IsNullOrEmpty(QueryParam) && TipoParam != -1 && TipoDetalhadoParam != null)
                {
                    List<int> tipos = new List<int>();
                    foreach (string t in TipoDetalhadoParam)
                        tipos.Add(Int32.Parse(t));

                    TipoEquipamento tipo = (TipoEquipamento)TipoParam;

                    PopulaGrid(Busca.Buscar(QueryParam, tipo, tipos));
                }
                // query e tipo
                else if (!string.IsNullOrEmpty(QueryParam) && TipoParam != -1)
                {
                    TipoEquipamento tipo = (TipoEquipamento)TipoParam;
                    PopulaGrid(tipo, QueryParam);
                }
                // busca por query
                else if(!string.IsNullOrEmpty(QueryParam))
                {
                    PopulaGrid(Busca.Buscar(QueryParam));
                }
                // busca por tipo
                else if (TipoParam != -1)
                {
                    TipoEquipamento tipo = (TipoEquipamento)TipoParam;
                    PopulaGrid(Busca.SelecionarTodos(tipo));
                }
                // busca todos
                else
                {
                    PopulaGrid(Busca.SelecionarTodos());
                }

                PreencherMensagem();
            }
        }
        catch (Exception ex)
        {
            Log.Write(ex, "pesquisar.aspx -> Page_Load");
            throw ex;
        }
    }

    private void PopulaGrid(TipoEquipamento tipo, int TipoDetalhadoParam)
    {
        gdvEquipamento.DataSource = Busca.SelecionarTodos(tipo, TipoDetalhadoParam);
        gdvEquipamento.DataBind();
    }

    private void PreencherListEquipamentos()
    {
        if (TipoParam == -1)
            ckbEquipamentos.Visible = false;
        //lbxEquipamentos.Visible = false;
        else
        {
            List<string> nomes = new List<string>();

            switch ((TipoEquipamento)TipoParam)
            {
                case TipoEquipamento.Agência:
                    nomes.AddRange(Enum.GetNames(typeof(TipoAgência)));
                    break;
                case TipoEquipamento.Compras:
                    nomes.AddRange(Enum.GetNames(typeof(TipoCompras)));
                    break;
                case TipoEquipamento.CulturaELazer:
                    nomes.AddRange(Enum.GetNames(typeof(TipoCulturaLazer)));
                    break;
                case TipoEquipamento.Gastronomia:
                    nomes.AddRange(Enum.GetNames(typeof(TipoGastronomia)));
                    break;
                case TipoEquipamento.Hospedagem:
                    nomes.AddRange(Enum.GetNames(typeof(TipoHospedagem)));
                    break;
                case TipoEquipamento.Noturno:
                    nomes.AddRange(Enum.GetNames(typeof(TipoNoturno)));
                    break;
                case TipoEquipamento.Religião:
                    nomes.AddRange(Enum.GetNames(typeof(TipoReligião)));
                    break;
                case TipoEquipamento.Saúde:
                    nomes.AddRange(Enum.GetNames(typeof(TipoSaúde)));
                    break;
                case TipoEquipamento.Serviços:
                    nomes.AddRange(Enum.GetNames(typeof(TipoServiços)));
                    break;
                case TipoEquipamento.Transportes:
                    nomes.AddRange(Enum.GetNames(typeof(TipoTransportes)));
                    break;
                case TipoEquipamento.UtilidadePublica:
                    nomes.AddRange(Enum.GetNames(typeof(TipoUtilidadePublica)));
                    break;
                default:
                    break;
            }
            ckbEquipamentos.DataSource = nomes;
            ckbEquipamentos.DataBind();
        }
    }

    private void PopulaGrid(TipoEquipamento tipo, string query)
    {
        try
        {
            gdvEquipamento.DataSource = Busca.Buscar(query, tipo, GetTiposSelecionados());
            gdvEquipamento.DataBind();

            PreencherMensagem();
        }
        catch (Exception ex)
        {
            Log.Write(ex, "pesquisar.aspx -> btnBuscar");
        }
    }
    private void PopulaGrid(List<Equipamento> list)
    {
        Session["result"] = list;
        gdvEquipamento.DataSource = list;
        gdvEquipamento.DataBind();

        PreencherMensagem();
    }

    protected void gdvEquipamento_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            if (gdvEquipamento.SelectedIndex != -1)
            {
                int id = Convert.ToInt32(gdvEquipamento.SelectedDataKey.Value);
                Response.Redirect("detalhar.aspx?id=" + id);
            }
        }
        catch (Exception ex)
        {
            Log.Write(ex, "pesquisar.aspx -> gdvSelectedIndexChanged");
        }
    }
    protected void gdvEquipamento_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        RowDataBound(gdvEquipamento, e);
    }

    protected void btnBuscar_Click(object sender, EventArgs e)
    {
        try
        {
            StringBuilder url = new StringBuilder();
            url.Append("pesquisar.aspx?");
            
            int paramCount = 0;

            // Tipo detalhado
            List<string> tipos = new List<string>();
            GetTiposSelecionados().ForEach(x => tipos.Add(x.ToString()));            
            if (tipos.Count > 0)
            {
                paramCount++;
                url.Append(string.Format("tipod={0}", string.Join(",", tipos.ToArray())));
            }

            // Query
            if (!string.IsNullOrEmpty(txtBusca.Text))
            {
                if (paramCount > 0)
                    url.Append("&");

                paramCount++;

                string query = HttpUtility.UrlEncode(txtBusca.Text);
                url.Append(string.Format("query={0}", query));
            }
            // Tipo
            if (TipoParam != -1)
            {
                if (paramCount > 0)
                    url.Append("&");

                paramCount++;

                url.Append(string.Format("tipoe={0}", TipoParam));
            }

            Response.Redirect(url.ToString());
        }
        catch (Exception ex)
        {
            Log.Write(ex, "pesquisar.aspx -> btnBuscar");
        }
    }


    private List<int> GetTiposSelecionados()
    {
        List<int> indices = new List<int>();
        for (int i = 0; i < ckbEquipamentos.Items.Count; i++)
        {
            if (ckbEquipamentos.Items[i].Selected)
                indices.Add(i);
        }
        return indices;
    }

    private void PreencherMensagem()
    {
        StringBuilder msg = new StringBuilder();
        if (TipoParam != -1)
        {
            msg.AppendLine("Buscando em: ");
            switch ((TipoEquipamento) TipoParam)
            {
                case TipoEquipamento.CulturaELazer:
                    msg.AppendLine("Cultura e Lazer");
                    break;
                default:
                    msg.AppendLine(((TipoEquipamento) TipoParam).ToString());
                    break;
            }
        }
        else
        {
            msg.AppendLine("Buscando em todos os equipamentos.");
        }
        
        msg.Append("<br />");

        if (Session["result"] != null)
        {
            List<Equipamento> list = (List<Equipamento>)Session["result"];

            if (list.Count == 0)
                msg.AppendLine("Nenhum resultado encontrado.");
            else if (list.Count == 1)
                msg.AppendLine("1 resultado encontrado.");
            else
                msg.AppendLine(list.Count + " resultados encontrados.");
        }
        lblMensagem.Text = msg.ToString();
    }

    protected void gdvEquipamento_PreRender(object sender, EventArgs e)
    {
        MontaMapasPesquisa(gdvEquipamento);
    }
    protected void gdvEquipamento_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gdvEquipamento.PageIndex = e.NewPageIndex;

        if (Session["result"] != null)
        {
            gdvEquipamento.DataSource = Session["result"];
            gdvEquipamento.DataBind();
        }
    }
}
